package org.codelibs.riverweb.app.service; import java.io.File; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Map; import javax.annotation.Resource; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.codelibs.core.io.FileUtil; import org.codelibs.fess.crawler.client.EsClient; import org.codelibs.riverweb.ScriptExecutionException; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.script.ScriptService.ScriptType; public class ScriptService { protected static final String SCRIPT_INDEX = ".scripts"; @Resource protected EsClient esClient; public Object execute(final String lang, final String script, final ScriptType scriptType, final Map<String, Object> localVars) { final ScriptEngineManager manager = new ScriptEngineManager(); final ScriptEngine engine = manager.getEngineByName(lang); for (final Map.Entry<String, Object> entry : localVars.entrySet()) { engine.put(entry.getKey(), entry.getValue()); } try { return engine.eval(getScriptContent(lang, script, scriptType)); } catch (final ScriptException e) { throw new ScriptExecutionException("lang: " + lang + ", script: " + script + ", type: " + scriptType, e); } } private String getScriptContent(final String lang, final String script, final ScriptType scriptType) { switch (scriptType) { case INLINE: return script; case FILE: if (Files.exists(Paths.get(script))) { return FileUtil.readText(new File(script)); } else { return FileUtil.readText(script); } case INDEXED: final GetResponse response = esClient.prepareGet(SCRIPT_INDEX, lang, script).execute().actionGet(); if (!response.isExists()) { throw new ScriptExecutionException("/" + SCRIPT_INDEX + "/" + lang + "/" + script + " does not exist."); } final Map<String, Object> source = response.getSource(); if (source != null) { return (String) source.get("script"); } break; default: break; } return null; } }